package com.edu.jvm.unit01.stingtable;

/**
 * intern 的使用：JDK6 vs JDK7/8
 *
 * @author five-five
 * @created 2021/10/12-9:18
 */
public class TestStringIntern02 {
    public static void main(String[] args) {
        /**
         * ① String s = new String("1")
         * 创建了两个对象
         * 		堆空间中一个new对象
         * 		字符串常量池中一个字符串常量"1"（注意：此时字符串常量池中已有"1"）
         * ② s.intern()由于字符串常量池中已存在"1"
         *
         * s  指向的是堆空间中的对象地址
         * s2 指向的是堆空间中常量池中"1"的地址
         * 所以不相等
         */
        String s1 = new String("1");
        s1.intern();
        String s2 = "1";
        //1.7/1.8:false  1.6:false
        System.out.println(s1 == s2);

        /**
         * ① String s3 = new String("1") + new String("1")
         * 等价于new String（"11"），但是，常量池中并不生成字符串"11"；
         *
         * ② s3.intern()
         * 由于此时常量池中并无"11"，所以把s3中记录的对象的地址存入常量池
         * 所以s3 和 s4 指向的都是一个地址
         */
        String s3 = new String("1") + new String("1");
        String s5=s3.intern();
        String s4 = "11";
        //1.7/1.8:true  1.6:false
        System.out.println(s3 == s4);
        System.out.println(s5 == s4);
        System.out.println(s5 == s3);
    }
}
